
// * 这是服务器端 * 
// (其它js都是客户端，两边的js互发数据处理游戏

var app=require('http').createServer();
var io=require('socket.io')(app);

var PORT=3000;

app.listen(PORT);

//客户端计数
var clientCount=0;

//存储客户端的socket
var socketMap={};
//网络上的两个程序通过一个双向的通信连接实现数据的交换，这个连接的一端称为一个socket

//connection:端口连接后：
io.on('connection', function(socket){

	clientCount=clientCount+1;
	socket.clientNum=clientCount;
	socketMap[clientCount]=socket;
	//以键值对形式存储：key:clientCount, value:socket;
	
	if(clientCount%2==1){
	//每两个用户可以一起游戏，所以相邻的用户两两组队(1和2,3和4,5和6)
		//所以单数玩家进来后显示等待
		socket.emit('waitting', '等待另一个玩家...');
	}else{
		//双数玩家进来后开始并给 他 和 他前面一个玩家 发送开始提示
		socket.emit('start', '开始游戏'); 
		if(socketMap[(clientCount-1)]){
			socketMap[(clientCount-1)].emit('start');
		}else{
			socket.emit('leave'); //对方掉线了
		}
	}


	//为客户端的socket绑定事件：
	var bindListener=function(socket, event){
		socket.on(event, function(data){
		//data:客户端socket的'event'类型的数据{type, dir}
			if(socket.clientNum%2==0){//双数玩家
				if(socketMap[socket.clientNum-1]){
					socketMap[socket.clientNum-1].emit(event, data);
					//给他前一个玩家发送初始化对手的数据
				}
			}else{
				if(socketMap[socket.clientNum+1]){
					socketMap[socket.clientNum+1].emit(event, data);
					//给他后一个玩家发送初始化对手的数据
				}
			}
		});
	}
	//使双方的对手界面数据实时变化:
	bindListener(socket, 'init');
	bindListener(socket, 'next');
	bindListener(socket, 'rotate');
	bindListener(socket, 'right');
	bindListener(socket, 'down');
	bindListener(socket, 'left');
	bindListener(socket, 'fall');
	bindListener(socket, 'fixed');
	bindListener(socket, 'line');
	bindListener(socket, 'setTime');
	bindListener(socket, 'gameover');
	bindListener(socket, 'bottomLines');
	bindListener(socket, 'addTailLines');
	
	
	//客户端断开连接：
	socket.on('disconnect', function(){
		if(socket.clientNum%2==0){

			if(socketMap[socket.clientNum-1]){
				socketMap[socket.clientNum-1].emit('leave');
			}
			//因为后面的delete(socketMap[socket.clientNum])所以socketMap[socket.clientNum-1]可能已undefind
			
		}else{
			if(socketMap[socket.clientNum+1]){
				socketMap[socket.clientNum+1].emit('leave');
			}
		}
		delete(socketMap[socket.clientNum]);
	});

});

console.log('websocket listening on port'+PORT);



